package es.ucm.fdi.isbc.viviendas.funciones_similitud;


import es.ucm.fdi.isbc.viviendas.representacion.ExtrasOtros;
import jcolibri.exception.NoApplicableSimilarityFunctionException;
import jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction;


public class SimExtrasOtros implements LocalSimilarityFunction {
	
	
	@Override
	public double compute(Object caseObject, Object queryObject)
			throws NoApplicableSimilarityFunctionException {
		//Si los dos objetos son null se devuelve 0
		if ((caseObject == null) || (queryObject == null))
			return 0;
		if (!(caseObject instanceof ExtrasOtros))
			throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), caseObject.getClass());
		if (!(queryObject instanceof ExtrasOtros))
			throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), queryObject.getClass());

		return (simExtras((ExtrasOtros)caseObject,(ExtrasOtros)queryObject));
		
	}


	private double simExtras(ExtrasOtros caso, ExtrasOtros query) {
		double sim=0.0;
		double sumSim=4.0;
		//Calculamos la similitud sumando con distinto peso
		if(caso.isBalcon()==query.isBalcon()) sim = sim + 0.4;
		if(caso.isJardinPrivado()==query.isJardinPrivado()) sim = sim + 0.6;
		if(caso.isPatio()==query.isPiscina()) sim = sim + 0.8;
		if(caso.isPiscinaComunitaria()==query.isPiscinaComunitaria()) sim = sim + 0.6;
		if(caso.isTerraza()==query.isTerraza()) sim = sim + 0.4;
		if(caso.isZonaComunitaria()==query.isZonaComunitaria()) sim = sim + 0.4;
		if(caso.isZonaDeportiva()==query.isZonaDeportiva()) sim = sim + 0.3;
		if(caso.isZonaInfantil()==query.isZonaInfantil()) sim = sim + 0.5;
		//Dividimos la suma por el total
		return (double)((double)sim/(double)sumSim);
	}


	@Override
	public boolean isApplicable(Object caseObject, Object queryObject) {
		//Comprobamos que los objetos son ExtrasFinca o null
		if((caseObject==null)&&(queryObject==null))
			return true;
		else if(caseObject==null)
			return queryObject instanceof ExtrasOtros;
		else if(queryObject==null)
			return caseObject instanceof  ExtrasOtros;
		else
			return (caseObject instanceof  ExtrasOtros)&&(queryObject instanceof  ExtrasOtros);
	}

}
